import SparkMD5 from "spark-md5";

const DEFAULT_SIZE = 20 * 1024 * 1024; // 20MB分片（平衡计算速度与内存占用）

const md5 = (file, chunkSize = DEFAULT_SIZE) => {
  // 参数校验：确保传入有效的File对象
  if (!(file instanceof File)) {
    return Promise.reject(new Error("传入的不是有效的File对象"));
  }
  // 分片大小限制（1MB ~ 100MB）
  if (chunkSize < 1024 * 1024 || chunkSize > 100 * 1024 * 1024) {
    chunkSize = DEFAULT_SIZE;
  }

  return new Promise((resolve, reject) => {
    const startMs = new Date().getTime();
    const chunks = Math.ceil(file.size / chunkSize);
    let currentChunk = 0;
    const spark = new SparkMD5.ArrayBuffer();
    const fileReader = new FileReader();

    // 读取分片完成回调
    fileReader.onload = function (e) {
      if (!e.target.result) {
        return reject(new Error(`分片${currentChunk}读取失败，结果为空`));
      }
      spark.append(e.target.result);
      currentChunk++;
      if (currentChunk < chunks) {
        loadNextChunk(); // 读取下一个分片（函数名与定义一致）
      } else {
        const md5sum = spark.end();
        console.log(
          `文件[${file.name}]MD5计算完成，耗时：${(new Date().getTime() - startMs) / 1000}s，MD5：${md5sum}`
        );
        resolve(md5sum);
      }
    };

    // 读取分片错误回调
    fileReader.onerror = function (error) {
      reject(new Error(`分片${currentChunk}读取失败：${error.message}`));
    };

    // 读取下一个分片
    function loadNextChunk() {
      console.log(`计算分片：${currentChunk + 1}/${chunks}（大小：${(chunkSize / 1024 / 1024).toFixed(1)}MB）`);
      const start = currentChunk * chunkSize;
      const end = Math.min(start + chunkSize, file.size);
      fileReader.readAsArrayBuffer(file.slice(start, end));
    }

    // 开始计算第一个分片
    loadNextChunk();
  });
};

export default md5;